package com.wkg.lotterysystem.common.pojo;

import com.wkg.lotterysystem.common.errorcode.ErrorCode;
import com.wkg.lotterysystem.common.errorcode.GlobalErrorCodeConstants;
import lombok.Data;
import org.springframework.util.Assert;

import java.io.Serializable;
/**
 * 通用返回结果类，用于封装接口返回的数据结构。
 * 包含：状态码、提示信息、具体数据。
 *
 * @param <T> 泛型，用于指定返回数据的具体类型。
 */
@Data
public class CommonResult<T> implements Serializable {
    private Integer code;
    private String msg;
    private T data;

    /**
     * 成功返回结构的静态方法。
     * code 设置为 200（成功状态码），msg 为空，data 为传入的数据。
     *
     * @param data 实际返回的数据
     * @param <T>  数据类型
     * @return 封装好的 CommonResult 对象
     */
    public static <T> CommonResult<T> success(T data) {
        CommonResult<T> result = new CommonResult<>();
        result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
        result.msg = "";
        result.data = data;
        return result;
    }
    /**
     * 错误返回结构的静态方法。
     * code 为传入的错误码，msg 为错误信息。
     *
     * @param code 错误码
     * @param msg  错误提示信息
     * @param <T>  数据类型（一般为 null）
     * @return 封装好的 CommonResult 对象
     */
    public static <T> CommonResult<T> error(Integer code, String msg) {
        Assert.isTrue(!GlobalErrorCodeConstants.SUCCESS.getCode().equals(code), "code 不是错误的异常");
        CommonResult<T> result = new CommonResult<>();
        result.code = code;
        result.msg = msg;
        return result;
    }

    /**
     * 根据统一的错误码对象（ErrorCode）进行错误返回。
     * 实际调用的是上面的 error(code, msg) 方法。
     *
     * @param errorCode 封装好的错误码对象（包含 code 和 msg）
     * @param <T>       数据类型
     * @return 封装好的 CommonResult 对象
     */
    public static <T> CommonResult<T> error(ErrorCode errorCode) {
        return error(errorCode.getCode(), errorCode.getMsg());
    }
}
